package com.haochang.chunkvod.app.utils;

import com.haochang.base.VodApplication;
import com.haochang.chunkvod.app.config.DeviceConfig;
import com.haochang.chunkvod.tools.thirdparty.image.core.DisplayImageOptions;
import com.haochang.chunkvod.tools.thirdparty.image.core.DisplayImageOptions.Builder;
import com.haochang.chunkvod.tools.thirdparty.image.core.ImageLoader;
import com.haochang.chunkvod.tools.thirdparty.image.core.ImageLoaderConfiguration;
import com.haochang.chunkvod.tools.thirdparty.image.core.assist.QueueProcessingType;

import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.Drawable;

/**
 * 图片加载
 * 
 * @author lixiaoli
 * 
 */
public class LoadImageUtils
{
	public static LoadImageUtils instance;
	public static DisplayImageOptions options = null;

	/**
	 * 获得实例对象
	 * 
	 * @return
	 */
	public static LoadImageUtils getInstance()
	{
		if (instance == null)
		{
			synchronized (LoadImageUtils.class)
			{
				if (instance == null)
				{
					instance = new LoadImageUtils();
				}
			}
		}
		return instance;
	}

	/**
	 * 设置加载属性
	 * @param drawableId drawableId:传0就崩
	 * @return
	 */
	public static DisplayImageOptions.Builder getBuilder(int drawableId)
	{
		Builder builder = new Builder();
		builder.cacheInMemory(true).cacheOnDisc(true).delayBeforeLoading(0).bitmapConfig(Config.RGB_565);
		if (drawableId > 0)
		{
			Drawable drawable = VodApplication.appContext.getResources().getDrawable(drawableId);
			builder.showImageForEmptyUri(drawable).showImageOnFail(drawable).showImageOnLoading(drawable);
		}
		return builder;
	}

	public static DisplayImageOptions.Builder getBuilder()
	{
		return getBuilder(0);
	}

	/**
	 * 初始化
	 */
	public static void initImageLoader(Context context)
	{
		setOptions();
		int memClass = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
		System.out.println("memClass:" + memClass);
		// 使用可用内存的1/4作为图片缓存
		final int cacheSize = 1024 * 1024 * memClass / 8;

		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context.getApplicationContext())//
				.defaultDisplayImageOptions(options)//
				.discCacheExtraOptions(DeviceConfig.displayWidthPixels(), DeviceConfig.displayHeightPixels(), CompressFormat.JPEG, 75, null)//
				.denyCacheImageMultipleSizesInMemory()//

				.tasksProcessingOrder(QueueProcessingType.LIFO)//
				.threadPoolSize(3)//线程数量
				.threadPriority(Thread.NORM_PRIORITY - 2)// 设置线程的优先级
				//				.denyCacheImageMultipleSizesInMemory() // 解码图像的大尺寸将在内存中缓存先前解码图像的小尺寸。
				// 当同一个Uri获取不同大小的图片，缓存到内存时，只缓存一个。默认会缓存多个不同的大小的相同图片
				//				.discCacheFileNameGenerator(new Md5FileNameGenerator())// 设置缓存文件的名字
				.discCacheFileCount(1000)// 缓存文件的最大个数
				//				.tasksProcessingOrder(QueueProcessingType.LIFO)// 设置图片下载和显示的工作队列排序
				//				.writeDebugLogs()// 输出log
				//				.memoryCacheSize(cacheSize)
				//				.memoryCache(new WeakMemoryCache())
				.memoryCacheSize(cacheSize)
				//				.imageDecoder(smartUriDecoder)//.taskExecutor(ThreadPool.getExecutor())//.taskExecutorForCachedImages(ThreadPool.getExecutor())//
				.build();
		ImageLoader.getInstance().init(config);
	}

	public void clearImageLoader()
	{

	}

	private static void setOptions()
	{
		/**
		 * //设置图片在下载期间显示的图片 showStubImage(R.drawable.ic_launcher)
		 * 
		 * //设置图片Uri为空或是错误的时候显示的图片 showImageForEmptyUri(R.drawable.ic_empty)
		 * 
		 * //设置图片加载/解码过程中错误时候显示的图片 showImageOnFail(R.drawable.ic_error)
		 * 
		 * //设置图片在下载前是否重置，复位 resetViewBeforeLoading()
		 * 
		 * //设置下载的图片是否缓存在内存中 cacheInMemory()
		 * 
		 * //设置下载的图片是否缓存在SD卡中 cacheOnDisc()
		 * 
		 * //设置图片的解码类型 bitmapConfig(Bitmap.Config.RGB_565)
		 * 
		 * //设置图片的解码配置 decodingOptions(android.graphics.BitmapFactory.Options
		 * decodingOptions)
		 * 
		 * //设置图片下载前的延迟 delayBeforeLoading(int delayInMillis)
		 * 
		 * //设置额外的内容给ImageDownloader extraForDownloader(Object extra)
		 * 
		 * //设置图片加入缓存前，对bitmap进行设置 preProcessor(BitmapProcessor preProcessor)
		 * 
		 * //设置显示前的图片，显示后这个图片一直保留在缓存中 postProcessor(BitmapProcessor
		 * postProcessor)
		 * 
		 * //设置图片以如何的编码方式显示 imageScaleType(ImageScaleType imageScaleType)
		 * 
		 * 
		 * displayer(BitmapDisplayer displayer) 
		 * displayer：
		 * RoundedBitmapDisplayer（int roundPixels）设置圆角图片
		 * FakeBitmapDisplayer（）这个类什么都没做 
		 * FadeInBitmapDisplayer（int durationMillis）设置图片渐显的时间 SimpleBitmapDisplayer()正常显示一张图片
		 * 
		 * 
		 * imageScaleType(ImageScaleType imageScaleType) 
		 * imageScaleType: 
		 * 	EXACTLY:			图像将完全按比例缩小的目标大小
		 *  EXACTLY_STRETCHED:	图片会缩放到目标大小完全
		 * IN_SAMPLE_INT:		图像将被二次采样的整数倍
		 * IN_SAMPLE_POWER_OF_2:图片将降低2倍，直到下一减少步骤，使图像更小的目标大小 
		 * NONE:图片不会调整
		 */
		options = new DisplayImageOptions.Builder().cacheInMemory(true)// 是否緩存都內存中
				.cacheOnDisc(true)// 是否緩存到sd卡上
				.bitmapConfig(Config.RGB_565)////设置图片的解码类型 
				.resetViewBeforeLoading(false)//设置图片在下载前是否重置，复位
				.build();
	}
}
